/**
 * 只拷贝对象类型，其他基本类型直接照原样输出；
简单的浅拷贝只需要区分数组和一般值对象，不要去管其他类型的对象；
只对目标对象上的ownProperty进行拷贝，而不要管原型链上的属性；
 * @param {*} source 
 * @returns 
 */
function shallowCopy(source) {
  if (Object(source) != source) {
    return source;
  }

  const result = Array.isArray(source) ? [] : {};

  for (let key in source) {
    if (source.hasOwnProperty(key)) {
      result[key] = source[key];
    }
  }

  return result;
}

let obj = { a: 1 };
const b = shallowCopy(obj);
console.log(b);

// 补充一个知识点，如果a是"object"类型的，如何判断a的b属性的值是否是真的undefined?

// () => a.b === undefined && a.hasOwnProperty(b)
